#include using namespace std; typedef long long int uli; int rint(char f){ char ch=getchar(); int sgn=1; int v=0; if(ch=='-')sgn=-1; else{ assert('0'<=ch && ch<='9'); v=ch-'0'; } while(true){ char ch=getchar(); if(ch==f)break; assert('0'<=ch && ch<='9'); v=v*10+ch-'0'; } return v*sgn; } const int mx=1e5+10; const uli mod=1e9+7; int a[mx]; struct iv{ int l,r; bool operator <(iv x)const{ return rs[2]; int dx[mx]; void add(set&s,iv x){ if(x.l==x.r)return; auto it=s.lower_bound(x); int from=x.l,to=x.r; while(it!=s.end() && eq(*it,x)){ from=min(from,it->l); to=max(to,it->r); it=s.erase(it); } s.insert({from,to}); } uli solve(){ int n=rint(' '); assert(1<=n && n<=1e5); int m=rint(' '); assert(1<=m && m<=1e5); int k=rint('\n'); assert(1<=k && k<=1e9); for(int i=0;i=0 && dx[i-1]==0 )ans=ans*uli(k)%mod; if(i==0 || dx[i-1]==0 )if(a[i]==-1)ans=ans*uli(k)%mod; i++; continue; } int l=i; int idx=-1; int sm=0; int mini=0,maxi=0; while(ito)return 0; ans=ans*uli(to-from+1)%mod; } else{ int sm=0; for(int j=l;jk)return 0; for(int j=l;j<=r+1;j++){ if(a[j]!=-1 && a[j]!=v)return 0; v+=dx[j]; if(v<=0 || v>k)return 0; } } } return ans; } int main(){ int t=rint('\n'); assert(1<=t && t<=20); while(t--){ uli ans=solve(); printf("%lld\n",ans); } assert(getchar()==EOF); return 0; }